from spyne import Application, rpc, ServiceBase, Integer, Unicode, Array
from spyne.protocol.soap import Soap11
from spyne.server.wsgi import WsgiApplication
from wsgiref.simple_server import make_server

class Student(ServiceBase):
    @rpc(Unicode, Unicode, Integer, _returns=Unicode)
    def create_student(ctx, name, student_id, age):
        """
        创建新学生记录
        @param name: 学生姓名
        @param student_id: 学生ID
        @param age: 学生年龄
        @return: 创建成功消息
        """
        return f"成功创建学生: {name}, ID: {student_id}, 年龄: {age}"

    @rpc(Unicode, _returns=Unicode)
    def get_student(ctx, student_id):
        """
        获取学生信息
        @param student_id: 学生ID
        @return: 学生信息
        """
        # 这里简化处理，实际应用中应该查询数据库
        return f"查询到学生 ID: {student_id} 的信息"

    @rpc(Unicode, Unicode, _returns=Unicode)
    def update_student_name(ctx, student_id, new_name):
        """
        更新学生姓名
        @param student_id: 学生ID
        @param new_name: 新的姓名
        @return: 更新成功消息
        """
        return f"已更新学生 {student_id} 的姓名为 {new_name}"

    @rpc(_returns=Array(Unicode))
    def list_students(ctx):
        """
        列出所有学生
        @return: 学生列表
        """
        # 示例数据
        return ["张三", "李四", "王五"]

def create_app():
    application = Application(
        [Student],
        tns='http://student.example.com',
        in_protocol=Soap11(validator='lxml'),
        out_protocol=Soap11()
    )
    return application

if __name__ == '__main__':
    application = create_app()
    wsgi_application = WsgiApplication(application)
    
    server = make_server('127.0.0.1', 8000, wsgi_application)
    print("SOAP 服务已启动在 http://127.0.0.1:8000")
    server.serve_forever()